/*
首先这些语句就是为了解构，匹配，以这个为基础去理解解构
*/

pub fn if_let_usage() {
    let number = Some(7);// 将 `optional` 定为 `Option<i32>` 类型
    let letter: Option<i32> = None;//这是枚举类型
    let emoticon: Option<i32> = None;

    //if let 结构读作: 若let将number解构成Some(i)则执行语句块
    if let Some(i) = number {
        println!("Matched {:?}!",i);
    }

    /*
    枚举类型与i32本质不一样，枚举类型只有两种情况,一个是值存在就可以用Some解构，一个不存在的情况下，你不能访问它，否则会导致运行时错误
    而下方的letter的枚举值在初始化就赋值不存在None
    */
    if let Some(i) = letter {
        println!("Matched {:?}!",i);
    }else {
        println!("Didn't match a number,let's go with a letter!");
    };

    let i_like_letters = false;
    if let Some(i) = emoticon {
        println!("Matched {:?}!",i);
    }else if i_like_letters {
        println!("Didn't match a number,let's go with a letter!");
    }else{
        println!("I don't like letters. Let's go with an emoticon :)!");
    };
}

/*

*/
enum Foo {
    Bar,
    Baz,    //非参数化枚举
    Qux(u32) //参数化枚举
}

/*
#[derive(PartialEq)]: 这是一个 Rust 属性，用于自动为枚举或结构体实现 PartialEq trait。PartialEq trait 允许你比较两个值是否相等。
  如果你没有为枚举实现这个 trait，那么默认情况下，你不能使用 == 操作符来比较两个枚举实例。
*/

pub fn match_if_let() {
    let a = Foo::Bar;
    let b = Foo::Baz;
    let c = Foo::Qux(100);

    //if let允许匹配枚举非参数化的变量
    if let Foo::Bar = a {
        println!("a is foobar");
    }

    if let Foo::Bar = b {
        println!("b is foobar");
    }
    //if let允许匹配枚举参数化的变量
    if let Foo::Qux(value) = c {
        println!("c is {}",value);
    }



}